import pandas as pd

import numpy as np

import requests

import datetime as dt

from math import exp

import matplotlib.pyplot as plt
from matplotlib.dates import MonthLocator, DateFormatter
# 读取气象数据文件
try:
    df = pd.read_excel(r'D:\Learn_Python\remote_sensing\data\meteo\dachang_2022.xlsx', 
                      header=None,
                      engine='openpyxl')  # 使用openpyxl引擎读取xlsx文件
except Exception as e:
    print(f"读取文件出错: {e}")
    raise

# 跳过前12行的元数据，获取实际的气象数据
result = df.iloc[12:].copy()

# 设置列名
result.columns = ['DAY', 'IRRAD', 'TMIN', 'TMAX', 'VAP', 'WIND', 'RAIN', 'SNOWDEPTH']

# 将日期列转换为datetime格式
result['DAY'] = pd.to_datetime(result['DAY'])

# 将其他列转换为数值类型
for col in result.columns[1:]:
    result[col] = pd.to_numeric(result[col], errors='coerce')

# 设置绘图风格
plt.style.use('seaborn-v0_8-whitegrid')
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号

# 创建子图
fig, axes = plt.subplots(3, 2, figsize=(15, 12), dpi=300)

# 1. 辐射数据
axes[0,0].plot(result.DAY, result.IRRAD, color='#FF7F0E', linewidth=1.5)
axes[0,0].set_ylabel('辐射量 (kJ/m2/day)', fontsize=10)
axes[0,0].tick_params(axis='both', labelsize=8)

# 2. 温度数据
axes[0,1].plot(result.DAY, result.TMAX, color='#D62728', label='最高温', linewidth=1.5)
axes[0,1].plot(result.DAY, result.TMIN, color='#1F77B4', label='最低温', linewidth=1.5)
axes[0,1].fill_between(result.DAY, result.TMIN, result.TMAX, alpha=0.2, color='#2196F3')
axes[0,1].set_ylabel('温度 (°C)', fontsize=10)
axes[0,1].legend(loc='upper right', fontsize=8)
axes[0,1].tick_params(axis='both', labelsize=8)

# 3. 水汽压
axes[1,0].plot(result.DAY, result.VAP, color='#2CA02C', linewidth=1.5)
axes[1,0].set_ylabel('水汽压 (kPa)', fontsize=10)
axes[1,0].tick_params(axis='both', labelsize=8)

# 4. 风速
axes[1,1].plot(result.DAY, result.WIND, color='#17BECF', linewidth=1.5)
axes[1,1].set_ylabel('风速 (m/s)', fontsize=10)
axes[1,1].tick_params(axis='both', labelsize=8)

# 5. 降水
axes[2,0].bar(result.DAY, result.RAIN, color='#1F77B4', alpha=0.6, width=1)
axes[2,0].set_ylabel('降水量 (mm)', fontsize=10)
axes[2,0].tick_params(axis='both', labelsize=8)

# 删除积雪深度子图
fig.delaxes(axes[2,1])

# 统一设置x轴格式
for ax in axes.flat:
    ax.xaxis.set_major_locator(MonthLocator())
    ax.xaxis.set_major_formatter(DateFormatter('%Y-%m'))
    plt.setp(ax.xaxis.get_majorticklabels(), rotation=45)
    ax.grid(True, linestyle='--', alpha=0.7)

# 调整布局
plt.tight_layout()

# 增加子图之间的间距
plt.subplots_adjust(hspace=0.4, wspace=0.3)

# 保存高质量图片
plt.savefig('weather_analysis.png', dpi=300, bbox_inches='tight')

# 设置更大的画板尺寸
plt.gcf().set_size_inches(20, 16)

# 增加子图之间的间距
plt.subplots_adjust(hspace=0.6, wspace=0.4, left=0.1)

plt.show()